Move logic for avoiding limited idle quantum into credit scheduler.
authorKeir Fraser <keir.fraser@citrix.com>
Thu, 2 Apr 2009 13:17:19 +0000 (14:17 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Thu, 2 Apr 2009 13:17:19 +0000 (14:17 +0100)
Signed-off-by: Keir Fraser <keir.fraser@citrix.com>
xen/common/sched_credit.c
xen/common/schedule.c

index c554c8b8b9bd0482bdda38b2674ad46521bf4a1b..67ff04647f9e11991629cea8b35181d51fb2eedb 100644 (file)
@@ -1146,7 +1146,8 @@ csched_schedule(s_time_t now)
     /*
      * Return task to run next...
      */
-    ret.time = MILLISECS(CSCHED_MSECS_PER_TSLICE);
+    ret.time = (is_idle_vcpu(snext->vcpu) ?
+                -1 : MILLISECS(CSCHED_MSECS_PER_TSLICE));
     ret.task = snext->vcpu;
 
     CSCHED_VCPU_CHECK(ret.task);
index 23807ea330ac083fb3eaceb6e47d764b8d17d7aa..fb2464f11d53060a2ee8824d80c87c2e47c7ddbb 100644 (file)
@@ -798,7 +798,6 @@ static void schedule(void)
     s_time_t              now = NOW();
     struct schedule_data *sd;
     struct task_slice     next_slice;
-    s32                   r_time;     /* time for new dom to run */
 
     ASSERT(!in_irq());
     ASSERT(this_cpu(mc_state).flags == 0);
@@ -814,13 +813,12 @@ static void schedule(void)
     /* get policy-specific decision on scheduling... */
     next_slice = ops.do_schedule(now);
 
-    r_time = next_slice.time;
     next = next_slice.task;
 
     sd->curr = next;
 
-    if ( !is_idle_vcpu(next) )
-        set_timer(&sd->s_timer, now + r_time);
+    if ( next_slice.time >= 0 ) /* -ve means no limit */
+        set_timer(&sd->s_timer, now + next_slice.time);
 
     if ( unlikely(prev == next) )
     {
@@ -836,7 +834,7 @@ static void schedule(void)
              next->domain->domain_id,
              (next->runstate.state == RUNSTATE_runnable) ?
              (now - next->runstate.state_entry_time) : 0,
-             r_time);
+             next_slice.time);
 
     ASSERT(prev->runstate.state == RUNSTATE_running);
     vcpu_runstate_change(